package com.sz.lk.wingsystem.mutils.log;

import android.os.Environment;
import android.text.TextUtils;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

import java.io.File;


/**
 * log本地记录工具类
 * Created by liuke on 2018/8/21.
 */

public class AppLogger {
    private static boolean isInitConfig = false;
    private static final Logger log = Logger.getRootLogger();
    public static String customTagPrefix = "GGLIUKE";

    private AppLogger() {
    }

    /**
     * 私有构造器
     */
    private static void initConfig(int RootLevel) {
        if (!isInitConfig) {
            AppLogConfigurator logConfiger = new AppLogConfigurator();
            // 设置Log4j的输出路径文件夹
            String rootPath = Environment.getExternalStorageDirectory().toString() + File.separator + "fuyang/";
            File dirFile = new File(rootPath);
            if (!dirFile.exists()) {
                dirFile.mkdirs();
            } // 文件夹准备

            // 其实这下面可以做成一个生成器的设计模式
            switch (RootLevel) {
                case 1:
                    logConfiger.setFileName(rootPath + "GGAgentInfoLog/log.txt");  // 设置文件名字
                    break;
                case 2:
                    logConfiger.setFileName(rootPath + "GGAgentDebugLog/log.txt");  // 设置文件名字
                    break;
                case 3:
                    logConfiger.setFileName(rootPath + "GGAgentErrorLog/log.txt");  // 设置文件名字
                    break;
                default:
                    logConfiger.setFileName(rootPath + "GGAgentDebugLog/log.txt");  // 设置文件名字
                    break;
            }
            switch (RootLevel) {
                case 1:
                    logConfiger.setRootLevel(Level.INFO); // 设置调试等级
                    break;
                case 2:
                    logConfiger.setRootLevel(Level.DEBUG); // 设置调试等级
                    break;
                case 3:
                    logConfiger.setRootLevel(Level.ERROR); // 设置调试等级
                    break;
                default:
                    logConfiger.setRootLevel(Level.DEBUG); // 设置调试等级
                    break;
            }
            logConfiger.setUseFileAppender(true); // 设置用户文件输出器
            logConfiger.setFilePattern("%d - [%p::%t] - %m%n"); // 设置文件输出模式
            logConfiger.setImmediateFlush(true); // 设置是否立即刷新
            logConfiger.setInternalDebugging(false);
            logConfiger.setMaxBackupSize(20); // 设置最大备份数量
            logConfiger.setMaxFileSize(1024 * 1024); // 设置最大文件数量
            logConfiger.setUseLogCatAppender(true);
            logConfiger.setLogCatPattern("%m%n");
            logConfiger.configure();
            isInitConfig = false;
        }
    }

    public static void v(String msg) {
        initConfig(2);
        log.debug(buildMessage(msg, 2));

    }

    public static void v(String msg, Throwable thr) {
        initConfig(2);
        log.debug(buildMessage(msg, 2), thr);
    }

    public static void d(String msg) {
        initConfig(2);
        log.debug(buildMessage(msg, 2));
    }

    public static void d(String msg, Throwable thr) {
        initConfig(2);
        log.debug(buildMessage(msg, 2), thr);
    }

    public static void i(String msg) {
        initConfig(1);
        log.info(buildMessage(msg, 1));
    }

    public static void i(String msg, Throwable thr) {
        initConfig(1);
        log.info(buildMessage(msg, 1), thr);
    }

    public static void w(String msg) {
        initConfig(2);
        log.warn(buildMessage(msg, 2));
    }

    public static void w(String msg, Throwable thr) {
        initConfig(2);
        log.warn(buildMessage(msg, 2), thr);
    }

    public static void w(Throwable thr) {
        initConfig(2);
        log.warn(buildMessage("", 2), thr);
    }

    public static void e(String msg) {
        initConfig(3);
        log.error(buildMessage(msg, 3));
    }

    public static void e(String msg, Throwable thr) {
        initConfig(3);
        log.error(buildMessage(msg, 3), thr);
    }

    /**
     * 生成消息
     *
     * @param msg
     * @return
     */
    protected static String buildMessage(String msg, int RootLevel) {
        initConfig(RootLevel);
        StackTraceElement caller = new Throwable().fillInStackTrace()
                .getStackTrace()[2];
        String tag = "%s.%s(Line:%d)"; // 占位符
        String callerClazzName = caller.getClassName(); // 获取到类名
        callerClazzName = callerClazzName.substring(callerClazzName
                .lastIndexOf(".") + 1);
        tag = String.format(tag, callerClazzName, caller.getMethodName(),
                caller.getLineNumber()); // 替换
        tag = TextUtils.isEmpty(customTagPrefix) ? tag : customTagPrefix + ":"
                + tag;
        return tag + msg + ";";
       /* return new StringBuilder().append(caller.getClassName()).append(".")
                .append(caller.getMethodName()).append("(): ").append(msg)
                .toString();*/
    }
}
